package top.zhangjianyong.blog.utils;

import java.util.Locale;
import java.util.Random;

/**
 * 颜色工具类
 *
 * @author zhangjianyong
 * @since 2024/12/19
 */
public class ColorUtil {

  private static final Random RANDOM = new Random();

  /** 预定义的颜色值池，确保生成的颜色都是比较美观的 */
  private static final String[] COLOR_POOL = {
    "#409EFF", // Element Plus 主蓝色
    "#67C23A", // 成功绿色
    "#E6A23C", // 警告橙色
    "#F56C6C", // 危险红色
    "#909399", // 信息灰色
    "#2D3748", // 深灰色
    "#805AD5", // 紫色
    "#38B2AC", // 青色
    "#DD6B20", // 橙色
    "#E53E3E", // 红色
    "#38A169", // 绿色
    "#3182CE", // 蓝色
    "#D69E2E", // 黄色
    "#9F7AEA", // 淡紫色
    "#4FD1C7", // 淡青色
    "#F687B3", // 粉色
    "#4FC08D", // Vue绿色
    "#F7DF1E", // JavaScript黄色
    "#3178C6", // TypeScript蓝色
    "#61DAFB", // React蓝色
    "#1572B6", // CSS蓝色
    "#339933", // Node.js绿色
    "#FF6B6B", // 珊瑚红
    "#E34C26", // HTML橙色
    "#007396", // Java蓝色
    "#6DB33F", // Spring绿色
    "#3776AB", // Python蓝色
    "#F05032", // Git橙红色
    "#2496ED", // Docker蓝色
    "#4479A1", // MySQL蓝色
    "#DC382D", // Redis红色
    "#FCC624", // Linux黄色
    "#009639" // Nginx绿色
  };

  /**
   * 生成随机颜色 从预定义的颜色池中随机选择一个颜色，确保颜色美观且适合UI展示
   *
   * @return 十六进制颜色值，如 #409EFF
   */
  public static String generateRandomColor() {
    int index = RANDOM.nextInt(COLOR_POOL.length);
    return COLOR_POOL[index];
  }

  /**
   * 生成完全随机的颜色（不推荐用于UI） 生成的颜色可能不够美观，仅在需要大量不重复颜色时使用
   *
   * @return 十六进制颜色值，如 #A1B2C3
   */
  public static String generatePureRandomColor() {
    int color = RANDOM.nextInt(0xFFFFFF + 1);
    return String.format("#%06X", color);
  }

  /**
   * 验证颜色值格式是否正确
   *
   * @param color 颜色值
   * @return 是否为有效的十六进制颜色值
   */
  public static boolean isValidColor(String color) {
    if (color == null || color.trim().isEmpty()) {
      return false;
    }
    // 支持 #FFFFFF 和 #FFF 格式
    return color.matches("^#[0-9A-Fa-f]{6}$") || color.matches("^#[0-9A-Fa-f]{3}$");
  }

  /**
   * 格式化颜色值为标准格式 #FFFFFF 支持多种输入格式：#FFF、#FFFFFF、FFF、FFFFFF
   *
   * @param color 输入的颜色值
   * @return 标准格式的颜色值 #FFFFFF，如果输入无效则返回null
   */
  public static String formatColor(String color) {
    if (color == null || color.trim().isEmpty()) {
      return null;
    }

    color = color.trim().toUpperCase(Locale.ROOT);

    // 移除开头的#号（如果有）
    if (color.startsWith("#")) {
      color = color.substring(1);
    }

    // 验证格式并转换
    if (color.matches("^[0-9A-F]{6}$")) {
      // 已经是6位格式
      return "#" + color;
    } else if (color.matches("^[0-9A-F]{3}$")) {
      // 3位格式转换为6位格式 (#FFF -> #FFFFFF)
      StringBuilder sb = new StringBuilder("#");
      for (char c : color.toCharArray()) {
        sb.append(c).append(c);
      }
      return sb.toString();
    }

    // 无效格式
    return null;
  }

  /**
   * 安全地获取颜色值 如果输入的颜色无效，则生成一个随机颜色
   *
   * @param color 输入的颜色值
   * @return 有效的颜色值 #FFFFFF 格式
   */
  public static String safeGetColor(String color) {
    String formatted = formatColor(color);
    return formatted != null ? formatted : generateRandomColor();
  }
}
